package cc.ccoke.design.singleton;

/**
 * 双重校验锁懒汉模式
 * @author ccoke
 */
public class DoubleCheckLazySingleton {
    /**
     * 添加volatile，禁止jvm将指令重排，避免多线程下发生获取到已分配地址但未初始化的实例
     */
    private volatile static DoubleCheckLazySingleton instance;

    /**
     * 添加私有构造函数，防止类被外部创建实例
     */
    private DoubleCheckLazySingleton() {

    }

    /**
     * 获取实例的Getter方法
     */
    public static DoubleCheckLazySingleton getInstance() {
        if (instance == null) {
            // 类加锁
            synchronized (DoubleCheckLazySingleton.class) {
                if (instance == null) {
                    instance = new DoubleCheckLazySingleton();
                }
            }
        }
        return instance;
    }
}
